@@ -95,8 +95,9 @@ def bmd_infos(request):  | 
            ||
| 95 | 95 | 
                     brands = BrandInfo.objects.filter(brand_id=operator.brand_id, status=True).order_by('position')
               | 
            
| 96 | 96 | 
                brands = [brand.data for brand in brands]  | 
            
| 97 | 97 | 
                 | 
            
| 98 | 
                -    models = ModelInfo.objects.filter(brand_id=operator.brand_id, status=True).order_by('position')
               | 
            |
| 99 | 
                - models = [model.data for model in models]  | 
            |
| 98 | 
                +    tmpmodels = ModelInfo.objects.filter(brand_id=operator.brand_id, display=True, status=True).order_by('position')
               | 
            |
| 99 | 
                + models = [model.data for model in tmpmodels]  | 
            |
| 100 | 
                +    jancodes = {model.jancode: model.data for model in tmpmodels}
               | 
            |
| 100 | 101 | 
                 | 
            
| 101 | 102 | 
                     distributors = DistributorInfo.objects.filter(brand_id=operator.brand_id, status=True).order_by('position')
               | 
            
| 102 | 103 | 
                distributors = [distributor.data for distributor in distributors]  | 
            
                @@ -105,6 +106,7 @@ def bmd_infos(request):  | 
            ||
| 105 | 106 | 
                'optor_id': operator.operator_id,  | 
            
| 106 | 107 | 
                'brands': brands,  | 
            
| 107 | 108 | 
                'models': models,  | 
            
| 109 | 
                + 'jancodes': jancodes,  | 
            |
| 108 | 110 | 
                'distributors': distributors,  | 
            
| 109 | 111 | 
                })  | 
            
| 110 | 112 | 
                 | 
            
                @@ -13,12 +13,17 @@ from utils.error.errno_utils import AdministratorStatusCode, ProductModelStatusC  | 
            ||
| 13 | 13 | 
                 | 
            
| 14 | 14 | 
                @logit  | 
            
| 15 | 15 | 
                def model_add(request):  | 
            
| 16 | 
                +    jancode = request.POST.get('jancode', '')
               | 
            |
| 16 | 17 | 
                     model_name = request.POST.get('model_name', '')
               | 
            
| 18 | 
                +    model_uni_name = request.POST.get('model_uni_name', '')
               | 
            |
| 17 | 19 | 
                     model_full_name = request.POST.get('model_full_name', '')
               | 
            
| 18 | 20 | 
                     image_path = request.POST.get('image_path', '')
               | 
            
| 19 | 21 | 
                     factory_yuan = request.POST.get('factory_yuan', 1000)
               | 
            
| 20 | 22 | 
                     integral = int(request.POST.get('integral', 100))
               | 
            
| 21 | 23 | 
                 | 
            
| 24 | 
                +    category = request.POST.get('category', '')
               | 
            |
| 25 | 
                +    warehouse = request.POST.get('warehouse', '')
               | 
            |
| 26 | 
                +  | 
            |
| 22 | 27 | 
                     admin_id = request.session.get('admin_id')
               | 
            
| 23 | 28 | 
                 | 
            
| 24 | 29 | 
                try:  | 
            
                @@ -28,8 +33,12 @@ def model_add(request):  | 
            ||
| 28 | 33 | 
                 | 
            
| 29 | 34 | 
                ModelInfo.objects.create(  | 
            
| 30 | 35 | 
                brand_id=administrator.brand_id,  | 
            
| 36 | 
                + jancode=jancode,  | 
            |
| 31 | 37 | 
                model_name=model_name,  | 
            
| 38 | 
                + model_uni_name=model_uni_name,  | 
            |
| 32 | 39 | 
                model_full_name=model_full_name,  | 
            
| 40 | 
                + category=category,  | 
            |
| 41 | 
                + warehouse=warehouse,  | 
            |
| 33 | 42 | 
                image=image_path,  | 
            
| 34 | 43 | 
                factory_yuan=factory_yuan,  | 
            
| 35 | 44 | 
                factory_fee=monetary.Yuan2Fen(factory_yuan),  | 
            
                @@ -63,13 +72,18 @@ def model_delete(request):  | 
            ||
| 63 | 72 | 
                 | 
            
| 64 | 73 | 
                @logit  | 
            
| 65 | 74 | 
                def model_update(request):  | 
            
| 75 | 
                +    jancode = request.POST.get('jancode', '')
               | 
            |
| 66 | 76 | 
                     model_id = request.POST.get('model_id', '')
               | 
            
| 67 | 77 | 
                     model_name = request.POST.get('model_name', '')
               | 
            
| 78 | 
                +    model_uni_name = request.POST.get('model_uni_name', '')
               | 
            |
| 68 | 79 | 
                     model_full_name = request.POST.get('model_full_name', '')
               | 
            
| 69 | 80 | 
                     image_path = request.POST.get('image_path', '')
               | 
            
| 70 | 81 | 
                     factory_yuan = request.POST.get('factory_yuan', 1000)
               | 
            
| 71 | 82 | 
                     integral = int(request.POST.get('integral', 100))
               | 
            
| 72 | 83 | 
                 | 
            
| 84 | 
                +    category = request.POST.get('category', '')
               | 
            |
| 85 | 
                +    warehouse = request.POST.get('warehouse', '')
               | 
            |
| 86 | 
                +  | 
            |
| 73 | 87 | 
                     admin_id = request.session.get('admin_id')
               | 
            
| 74 | 88 | 
                 | 
            
| 75 | 89 | 
                try:  | 
            
                @@ -82,10 +96,18 @@ def model_update(request):  | 
            ||
| 82 | 96 | 
                except ModelInfo.DoesNotExist:  | 
            
| 83 | 97 | 
                return response(ProductModelStatusCode.MODEL_NOT_FOUND)  | 
            
| 84 | 98 | 
                 | 
            
| 99 | 
                + if jancode:  | 
            |
| 100 | 
                + modelObj.jancode = jancode  | 
            |
| 85 | 101 | 
                if model_name:  | 
            
| 86 | 102 | 
                modelObj.model_name = model_name  | 
            
| 103 | 
                + if model_uni_name:  | 
            |
| 104 | 
                + modelObj.model_uni_name = model_uni_name  | 
            |
| 87 | 105 | 
                if model_full_name:  | 
            
| 88 | 106 | 
                modelObj.model_full_name = model_full_name  | 
            
| 107 | 
                + if category:  | 
            |
| 108 | 
                + modelObj.category = category  | 
            |
| 109 | 
                + if warehouse:  | 
            |
| 110 | 
                + modelObj.warehouse = warehouse  | 
            |
| 89 | 111 | 
                if image_path:  | 
            
| 90 | 112 | 
                modelObj.distributor_province_name = image_path  | 
            
| 91 | 113 | 
                if factory_yuan:  | 
            
                @@ -194,9 +194,9 @@ urlpatterns += [  | 
            ||
| 194 | 194 | 
                ]  | 
            
| 195 | 195 | 
                 | 
            
| 196 | 196 | 
                urlpatterns += [  | 
            
| 197 | 
                - url(r'^brands$', mch_views.brands_list, name='brands_list'),  | 
            |
| 198 | 
                - url(r'^models$', mch_views.models_list, name='models_list'),  | 
            |
| 199 | 
                - url(r'^distributors$', mch_views.distributors_list, name='distributors_list'),  | 
            |
| 197 | 
                + # url(r'^brands$', mch_views.brands_list, name='brands_list'),  | 
            |
| 198 | 
                + # url(r'^models$', mch_views.models_list, name='models_list'),  | 
            |
| 199 | 
                + # url(r'^distributors$', mch_views.distributors_list, name='distributors_list'),  | 
            |
| 200 | 200 | 
                url(r'^infos$', mch_views.bmd_infos, name='bmd_infos'),  | 
            
| 201 | 201 | 
                 | 
            
| 202 | 202 | 
                url(r'^log/upload$', file_views.file_upload, name='log_upload'),  | 
            
                @@ -381,6 +381,7 @@ DEBUG_STATISTIC_DATA_FLAG = False  | 
            ||
| 381 | 381 | 
                 | 
            
| 382 | 382 | 
                KODO_DEFAULT_BRAND_PK = 0  | 
            
| 383 | 383 | 
                KODO_DEFAULT_BRAND_ID = ''  | 
            
| 384 | 
                +KODO_DEFAULT_BRAND_NAME = ''  | 
            |
| 384 | 385 | 
                KODO_DEFAULT_BRAND_DOMAIN = ''  | 
            
| 385 | 386 | 
                 | 
            
| 386 | 387 | 
                 KODO_CLERK_AUTH_URL = 'http://pai.ai/w/o?r=http%3A%2F%2Fkodo.xfoto.com.cn%2Fp%2Fclerk%3Fbrand_id%3D{0}'
               | 
            
                @@ -63,10 +63,10 @@ class BrandInfoAdmin(DeleteModelAdmin, admin.ModelAdmin):  | 
            ||
| 63 | 63 | 
                 | 
            
| 64 | 64 | 
                 | 
            
| 65 | 65 | 
                class ModelInfoAdmin(DeleteModelAdmin, admin.ModelAdmin):  | 
            
| 66 | 
                -    list_display = ('brand_id', 'brand_name', 'model_id', 'model_name', 'model_full_name', 'model_descr', 'image', 'url', 'factory_yuan', 'integral', 'position', 'status', 'created_at', 'updated_at')
               | 
            |
| 67 | 
                -    list_filter = ('brand_name', 'status')
               | 
            |
| 66 | 
                +    list_display = ('brand_id', 'brand_name', 'jancode', 'model_id', 'model_uni_name', 'model_name', 'model_full_name', 'model_descr', 'category', 'warehouse', 'image', 'url', 'factory_yuan', 'integral', 'position', 'display', 'status', 'created_at', 'updated_at')
               | 
            |
| 67 | 
                +    list_filter = ('brand_name', 'category', 'warehouse', 'display', 'status')
               | 
            |
| 68 | 68 | 
                     readonly_fields = ('brand_name', 'factory_fee')
               | 
            
| 69 | 
                -    search_fields = ('brand_id', 'brand_name', 'model_id', 'model_name', 'model_full_name', 'model_descr')
               | 
            |
| 69 | 
                +    search_fields = ('brand_id', 'brand_name', 'jancode', 'model_id', 'model_uni_name', 'model_name', 'model_full_name', 'model_descr', 'category', 'warehouse')
               | 
            |
| 70 | 70 | 
                 | 
            
| 71 | 71 | 
                def save_model(self, request, obj, form, change):  | 
            
| 72 | 72 | 
                obj.brand_id = strip(obj.brand_id)  | 
            
                @@ -0,0 +1,45 @@  | 
            ||
| 1 | 
                +# -*- coding: utf-8 -*-  | 
            |
| 2 | 
                +# Generated by Django 1.11.15 on 2018-08-25 20:48  | 
            |
| 3 | 
                +from __future__ import unicode_literals  | 
            |
| 4 | 
                +  | 
            |
| 5 | 
                +from django.db import migrations, models  | 
            |
| 6 | 
                +  | 
            |
| 7 | 
                +  | 
            |
| 8 | 
                +class Migration(migrations.Migration):  | 
            |
| 9 | 
                +  | 
            |
| 10 | 
                + dependencies = [  | 
            |
| 11 | 
                +        ('mch', '0022_auto_20180522_1355'),
               | 
            |
| 12 | 
                + ]  | 
            |
| 13 | 
                +  | 
            |
| 14 | 
                + operations = [  | 
            |
| 15 | 
                + migrations.AddField(  | 
            |
| 16 | 
                + model_name='modelinfo',  | 
            |
| 17 | 
                + name='category',  | 
            |
| 18 | 
                + field=models.CharField(blank=True, db_index=True, help_text='\u578b\u53f7\u7c7b\u522b', max_length=32, null=True, verbose_name='category'),  | 
            |
| 19 | 
                + ),  | 
            |
| 20 | 
                + migrations.AddField(  | 
            |
| 21 | 
                + model_name='modelinfo',  | 
            |
| 22 | 
                + name='display',  | 
            |
| 23 | 
                + field=models.BooleanField(db_index=True, default=True, help_text='Display', verbose_name='display'),  | 
            |
| 24 | 
                + ),  | 
            |
| 25 | 
                + migrations.AddField(  | 
            |
| 26 | 
                + model_name='modelinfo',  | 
            |
| 27 | 
                + name='jancode',  | 
            |
| 28 | 
                + field=models.CharField(blank=True, db_index=True, help_text='JAN_CODE', max_length=16, null=True, verbose_name='jancode'),  | 
            |
| 29 | 
                + ),  | 
            |
| 30 | 
                + migrations.AddField(  | 
            |
| 31 | 
                + model_name='modelinfo',  | 
            |
| 32 | 
                + name='model_uni_name',  | 
            |
| 33 | 
                + field=models.CharField(blank=True, help_text='\u578b\u53f7\u7edf\u4e00\u540d\u79f0', max_length=32, null=True, verbose_name='model_uni_name'),  | 
            |
| 34 | 
                + ),  | 
            |
| 35 | 
                + migrations.AddField(  | 
            |
| 36 | 
                + model_name='modelinfo',  | 
            |
| 37 | 
                + name='warehouse',  | 
            |
| 38 | 
                + field=models.CharField(blank=True, db_index=True, help_text='\u6240\u5c5e\u4ed3\u5e93', max_length=32, null=True, verbose_name='warehouse'),  | 
            |
| 39 | 
                + ),  | 
            |
| 40 | 
                + migrations.AlterField(  | 
            |
| 41 | 
                + model_name='modelinfo',  | 
            |
| 42 | 
                + name='model_name',  | 
            |
| 43 | 
                + field=models.CharField(blank=True, help_text='\u578b\u53f7\u540d\u79f0', max_length=32, null=True, verbose_name='model_name'),  | 
            |
| 44 | 
                + ),  | 
            |
| 45 | 
                + ]  | 
            
                @@ -122,11 +122,17 @@ class ModelInfo(BaseModelMixin):  | 
            ||
| 122 | 122 | 
                brand_id = models.CharField(_(u'brand_id'), max_length=32, blank=True, null=True, help_text=u'品牌唯一标识', db_index=True)  | 
            
| 123 | 123 | 
                brand_name = models.CharField(_(u'brand_name'), max_length=255, blank=True, null=True, help_text=u'品牌名称')  | 
            
| 124 | 124 | 
                 | 
            
| 125 | 
                + jancode = models.CharField(_(u'jancode'), max_length=16, blank=True, null=True, help_text=u'JAN_CODE', db_index=True)  | 
            |
| 126 | 
                +  | 
            |
| 125 | 127 | 
                model_id = ShortUUIDField(_(u'model_id'), max_length=32, help_text=u'型号唯一标识', db_index=True, unique=True)  | 
            
| 126 | 
                - model_name = models.CharField(_(u'model_name'), max_length=255, blank=True, null=True, help_text=u'型号名称')  | 
            |
| 128 | 
                + model_name = models.CharField(_(u'model_name'), max_length=32, blank=True, null=True, help_text=u'型号名称')  | 
            |
| 129 | 
                + model_uni_name = models.CharField(_(u'model_uni_name'), max_length=32, blank=True, null=True, help_text=u'型号统一名称')  | 
            |
| 127 | 130 | 
                model_full_name = models.CharField(_(u'model_full_name'), max_length=255, blank=True, null=True, help_text=u'型号全名称')  | 
            
| 128 | 131 | 
                model_descr = models.TextField(_(u'model_descr'), max_length=255, blank=True, null=True, help_text=u'型号描述')  | 
            
| 129 | 132 | 
                 | 
            
| 133 | 
                + category = models.CharField(_(u'category'), max_length=32, blank=True, null=True, help_text=u'型号类别', db_index=True)  | 
            |
| 134 | 
                + warehouse = models.CharField(_(u'warehouse'), max_length=32, blank=True, null=True, help_text=u'所属仓库', db_index=True)  | 
            |
| 135 | 
                +  | 
            |
| 130 | 136 | 
                image = models.ImageField(_(u'image'), upload_to=upload_path, blank=True, null=True, help_text=u'图片')  | 
            
| 131 | 137 | 
                url = models.CharField(_(u'url'), max_length=255, blank=True, null=True, help_text=u'链接')  | 
            
| 132 | 138 | 
                 | 
            
                @@ -137,6 +143,8 @@ class ModelInfo(BaseModelMixin):  | 
            ||
| 137 | 143 | 
                 | 
            
| 138 | 144 | 
                position = models.IntegerField(_(u'position'), default=1, help_text=u'排序')  | 
            
| 139 | 145 | 
                 | 
            
| 146 | 
                + display = models.BooleanField(_(u'display'), default=True, help_text=_(u'Display'), db_index=True)  | 
            |
| 147 | 
                +  | 
            |
| 140 | 148 | 
                class Meta:  | 
            
| 141 | 149 | 
                verbose_name = _(u'型号信息')  | 
            
| 142 | 150 | 
                verbose_name_plural = _(u'型号信息')  | 
            
                @@ -176,9 +184,13 @@ class ModelInfo(BaseModelMixin):  | 
            ||
| 176 | 184 | 
                @property  | 
            
| 177 | 185 | 
                def admindata(self):  | 
            
| 178 | 186 | 
                         return {
               | 
            
| 187 | 
                + 'jancode': self.jancode,  | 
            |
| 179 | 188 | 
                'model_id': self.model_id,  | 
            
| 180 | 189 | 
                'model_name': self.model_name,  | 
            
| 190 | 
                + 'model_uni_name': self.model_uni_name,  | 
            |
| 181 | 191 | 
                'model_full_name': self.model_full_name,  | 
            
| 192 | 
                + 'category': self.category,  | 
            |
| 193 | 
                + 'warehouse': self.warehouse,  | 
            |
| 182 | 194 | 
                'image_path': self.image_path,  | 
            
| 183 | 195 | 
                'image_url': self.image_url,  | 
            
| 184 | 196 | 
                'factory_yuan': self.factory_yuan,  | 
            
                @@ -2,6 +2,10 @@  | 
            ||
| 2 | 2 | 
                 | 
            
| 3 | 3 | 
                from __future__ import division  | 
            
| 4 | 4 | 
                 | 
            
| 5 | 
                +import xlrd  | 
            |
| 6 | 
                +from django.conf import settings  | 
            |
| 7 | 
                +from pysnippets.strsnippets import strip  | 
            |
| 8 | 
                +  | 
            |
| 5 | 9 | 
                from mch.models import BrandInfo, DistributorInfo, ModelInfo  | 
            
| 6 | 10 | 
                from statistic.models import (ConsumeDistributorSaleStatisticInfo, ConsumeModelSaleStatisticInfo,  | 
            
| 7 | 11 | 
                ConsumeProvinceSaleStatisticInfo, DistributorSaleStatisticInfo, ModelSaleStatisticInfo,  | 
            
                @@ -91,3 +95,44 @@ def pre_all():  | 
            ||
| 91 | 95 | 
                pre_provinces()  | 
            
| 92 | 96 | 
                pre_models()  | 
            
| 93 | 97 | 
                pre_distributors()  | 
            
| 98 | 
                +  | 
            |
| 99 | 
                +  | 
            |
| 100 | 
                +# In [55]: cv  | 
            |
| 101 | 
                +# Out[55]: 991000295147.0  | 
            |
| 102 | 
                +#  | 
            |
| 103 | 
                +# In [56]: str(cv)  | 
            |
| 104 | 
                +# Out[56]: '9.91000295147e+11'  | 
            |
| 105 | 
                +#  | 
            |
| 106 | 
                +# In [57]: repr(cv)  | 
            |
| 107 | 
                +# Out[57]: '991000295147.0'  | 
            |
| 108 | 
                +def convert_to_str(cv):  | 
            |
| 109 | 
                + if isinstance(cv, (int, float)):  | 
            |
| 110 | 
                +        cv = repr(cv)[:-2] if repr(cv).endswith('.0') else repr(cv)
               | 
            |
| 111 | 
                + if isinstance(cv, str):  | 
            |
| 112 | 
                + cv = cv.strip()  | 
            |
| 113 | 
                + return cv  | 
            |
| 114 | 
                +  | 
            |
| 115 | 
                +  | 
            |
| 116 | 
                +def pre_new_models(fpath='./pre/static/models_20180816.xls'):  | 
            |
| 117 | 
                + workbook = xlrd.open_workbook(fpath)  | 
            |
| 118 | 
                +    # sheet = workbook.sheet_by_name('SMR')
               | 
            |
| 119 | 
                + sheets = workbook.sheets()  | 
            |
| 120 | 
                + sheet = sheets[0]  | 
            |
| 121 | 
                + nrows = sheet.nrows  | 
            |
| 122 | 
                + for idx in range(1, nrows):  | 
            |
| 123 | 
                + rvals = sheet.row_values(idx)  | 
            |
| 124 | 
                + print rvals  | 
            |
| 125 | 
                +  | 
            |
| 126 | 
                + jancode = strip(rvals[0])  | 
            |
| 127 | 
                + if not jancode:  | 
            |
| 128 | 
                + continue  | 
            |
| 129 | 
                +  | 
            |
| 130 | 
                + mdl, _ = ModelInfo.objects.get_or_create(jancode=jancode)  | 
            |
| 131 | 
                + mdl.brand_id = settings.KODO_DEFAULT_BRAND_ID  | 
            |
| 132 | 
                + mdl.brand_name = settings.KODO_DEFAULT_BRAND_NAME  | 
            |
| 133 | 
                + mdl.model_name = strip(rvals[1])  | 
            |
| 134 | 
                + mdl.model_uni_name = strip(rvals[2])  | 
            |
| 135 | 
                + mdl.category = strip(rvals[3])  | 
            |
| 136 | 
                + mdl.model_full_name = strip(rvals[4])  | 
            |
| 137 | 
                + mdl.warehouse = strip(rvals[5])  | 
            |
| 138 | 
                + mdl.save()  |